#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""MySQLPass 最终打包脚本
这个脚本将MySQLPass项目打包成一个可独立运行的exe程序，
包含所有必要的设置以确保GUI界面能够正确显示。
"""

import os
import sys
import subprocess
import shutil
import time

# 确保脚本在正确的目录下运行
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)

# 定义项目相关路径和参数
BUILD_NAME = "MySQLPass"
MAIN_SCRIPT = "main.py"
OUTPUT_DIR = "dist"
BUILD_DIR = "build"


def check_pyinstaller():
    """检查PyInstaller是否已安装"""
    try:
        subprocess.run([sys.executable, "-m", "PyInstaller", "--version"], 
                      check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        return True
    except (subprocess.CalledProcessError, FileNotFoundError):
        return False


def install_pyinstaller():
    """安装PyInstaller"""
    print("PyInstaller未安装，正在尝试安装...")
    try:
        subprocess.run([sys.executable, "-m", "pip", "install", "pyinstaller"], check=True)
        print("PyInstaller安装成功")
        return True
    except Exception as e:
        print(f"PyInstaller安装失败: {e}")
        print("请手动安装: python -m pip install pyinstaller")
        return False


def clean_build_dir():
    """清理之前的构建文件"""
    print("清理之前的构建文件...")
    
    # 清理PyInstaller生成的目录
    for dir_name in [BUILD_DIR, OUTPUT_DIR]:
        dir_path = os.path.join(script_dir, dir_name)
        if os.path.exists(dir_path):
            try:
                shutil.rmtree(dir_path)
                print(f"已清理目录: {dir_path}")
            except Exception as e:
                print(f"清理目录 {dir_path} 失败: {e}")
    
    # 清理spec文件
    for file in os.listdir(script_dir):
        if file.endswith(".spec"):
            try:
                os.remove(os.path.join(script_dir, file))
                print(f"已清理spec文件: {file}")
            except Exception as e:
                print(f"清理spec文件 {file} 失败: {e}")


def build_with_pyinstaller():
    """使用PyInstaller打包应用"""
    print("开始打包MySQLPass项目为独立可执行程序...")
    
    # 构建PyInstaller命令参数 - 包含窗口模式和所有必要设置
    cmd = [
        sys.executable,
        "-m",
        "PyInstaller",
        "--name", BUILD_NAME,
        "--windowed",  # 不显示控制台窗口（最终版本使用）
        "--add-data", f"src{os.pathsep}src",
        "--noupx",  # 禁用UPX压缩以避免兼容性问题
        "--onefile",  # 打包成单个可执行文件
        "--icon", "src\\data\\icon.png",  # 使用png格式图标
        MAIN_SCRIPT
    ]
    
    print(f"执行打包命令: {cmd}")
    
    # 执行打包命令
    try:
        subprocess.run(cmd, check=True)
        print("打包成功")
        return True
    except subprocess.CalledProcessError as e:
        print(f"打包失败: {e}")
        return False
    except Exception as e:
        print(f"打包过程中发生未知错误: {e}")
        return False


def verify_build():
    """验证打包结果"""
    exe_path = os.path.join(OUTPUT_DIR, f"{BUILD_NAME}.exe")
    if os.path.exists(exe_path):
        file_size = os.path.getsize(exe_path) / 1024 / 1024
        print(f"\n=== 打包完成 ===")
        print(f"独立可执行文件已生成: {exe_path}")
        print(f"文件大小: {file_size:.2f} MB")
        print("\n使用说明:")
        print("1. 直接双击运行MySQLPass.exe文件")
        print("2. 程序会自动启动图形界面")
        print("3. 无需安装Python环境或其他依赖")
        print("\n注意事项:")
        print("- 如果程序启动后未显示窗口，请尝试以管理员身份运行")
        print("- 首次启动可能需要几秒钟时间加载")
        return True
    else:
        print(f"打包失败: 未找到生成的可执行文件 {exe_path}")
        return False


def main():
    """主函数"""
    print("=====================================")
    print(f"MySQLPass 最终打包工具 v1.0.0")
    print("=====================================")
    
    # 检查PyInstaller是否已安装
    if not check_pyinstaller():
        if not install_pyinstaller():
            sys.exit(1)
    
    # 清理之前的构建文件
    clean_build_dir()
    
    # 开始打包
    if build_with_pyinstaller():
        # 验证打包结果
        verify_build()
    else:
        print("打包失败，请检查错误信息")
        sys.exit(1)


if __name__ == "__main__":
    main()